package aterrizar.test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import aterrizar.Avion;
import aterrizar.CategoriaAvion;
import aterrizar.Clase;
import aterrizar.exceptions.CategoriaAvionInfructuosa;
import aterrizar.exceptions.ClaseAsientoDuplicadoException;
import aterrizar.exceptions.ClaseAsientoNoExistenteException;

public class AdministrarAviones {

	private int cantidad;
	private Avion avion;
	
	@Before
	public void setUp() throws CategoriaAvionInfructuosa {
		// @source: http://en.wikipedia.org/wiki/Boeing_737#Specifications
		avion = new Avion(CategoriaAvion.AVION_MEDIA_DISTANCIA, "Boeing", "737-100", 780);

		// Cantidad aleatoria entre 1 y 1000
		cantidad = (int)Math.round(Math.random()*1000) + 1;
	}

	/**
	 * Verifico que al avion se le puedan agregar asientos 
	 * @throws ClaseAsientoDuplicadoException
	 */
	@Test
	public void testCrearUnAvionFeliz() throws ClaseAsientoDuplicadoException {
		// Inicialmente el Avion no tiene asientos
		//assertFalse(avion.tieneAsientosClase(Clase.Primera));

		// Creo N asientos de primera clase
		avion.crearAsientos(cantidad, Clase.Primera);

		// Verifico que los asientos sean de primera clase
		assertTrue(avion.tieneAsientosClase(Clase.Primera));

		// Verifico que no hayan asientos de otra clase
		assertFalse(avion.tieneAsientosClase(Clase.Ejecutiva));
	}

	/**
	 * Verifico que a un avion no se le puedan agregar asientos 
	 * de la misma clase 2 veces 
	 * @throws ClaseAsientoDuplicadoException
	 */
	@Test (expected=ClaseAsientoDuplicadoException.class)
	public void testCrearUnAvionConClasesDuplicadas() throws ClaseAsientoDuplicadoException {
		// Creo N asientos de primera clase
		avion.crearAsientos(cantidad, Clase.Primera);
		
		// Creo N asientos de primera clase otra vez
		avion.crearAsientos(cantidad, Clase.Primera);
		
		fail("Ya existe la clase de asientos; el test ha fallado :(");
	}
	
	/**
	 * Verifico que la cantidad de asientos creados sea correcta
	 * @throws ClaseAsientoDuplicadoException
	 * @throws ClaseAsientoNoExistenteException
	 */
	@Test
	public void testVerificarCantidadAsientosCreados() throws ClaseAsientoDuplicadoException, ClaseAsientoNoExistenteException {
		avion.crearAsientos(cantidad, Clase.Primera);

		assertEquals(cantidad, avion.getAsientos(Clase.Primera).size());
	}
}
